# 四大数据容器
# 列表list、元组tuple、字典dict、集合set

# 列表list
# 特点：可变的，里面的元素可以重复，元素的类型可以不唯一，有序

# 定义一个列表
list1 = [1, 2, 3, 4, 4, 4, "abc", 1.1, True]
print(list1, type(list1))
# 取元素
print(list1[6])
print(list1[-7])  # 3
# 切片
# list1[起始位置:结束位置:步长]
# 左闭右开 步长默认为1 起始位置默认 第一个元素 结束位置默认 最后一个元素
print(list1[1:4:1])  # [2, 3, 4]
print(list1[-8:-5:1])  # [2, 3, 4]
print(list1[0:7:2])  # [1, 3, 4, 'abc']
print(list1[-8:-5:-1])  # []
print(list1[-6:-9:-1])  # [4, 3, 2]
print(list1[-8:-10:-1])  # [2, 3, 4]
# 倒转
print(list1[::-1])
print(list1)
print(list1.reverse())
print(list1)

# 增 删 改

# 增
list1.append(0)  # 将元素追加到末尾
print(list1)
list1.insert(1, False)
print(list1)
list1.extend([1, 2])  # 传入一个list 进行合并
print(list1)
print(list1 + [3, 4])  # 对两个list合并 并返回新的list 不会对原有list造成改变
print(list1)

# 删
list1.remove('abc')
print(list1)
list1.remove(4)  # remove 只会按照传入的 值 删除一次
print(list1)

print(list1.pop())  # 默认将最后一个元素移除并返回
print(list1.pop())
print(list1.pop(1))  # 也支持传入一个索引进行移除并返回
print(list1)

del list1[1]
print(list1)

# list1.clear() # 清空
# print(list1)

# 改
list1[1] = 5
print(list1)

print(list1.copy())  # 返回一个新的list
list1.append(False)
print(list1)
print(list1.count(1))  # 统计1出现了几次
print(list1.count(True))  # 统计True出现了几次
print(list1.count(0))  # 统计0出现了几次
print(list1.count(False))  # 统计False出现了几次
print(list1.count(2))  # 统计2出现了几次
print(list1.index(3))  # 查找 元素3 出现的位置index
list1.sort()  # 排序
print(list1)

# 元组tuple
# 特点：不可变的，里面的元素可以重复，元素的类型可以不唯一，有序

# 定义
tuple1 = (1, 2, 2, 3, 3, 4, True, "abc", False)
print(tuple1, type(tuple1))
print(tuple1[7])
# tuple1[7] = 'efg' # 元组不能进行修改
# len方法 返回变量的长度
print(len(tuple1))

# 定义一个一元组：只包含一个元素的元组
tuple2 = (1,)
print(tuple2, type(tuple2))

# 字典dict
# 格式很像json
# 相当于Java中的Map
# 特点：可变的，无序的，元素都是kv格式的，key是唯一的，value不要求唯一，key必须是不可变的
# 不可变的：基本数据类型 + 元组
# 适用于快速查询的场景，查询速度不会受元素个数的影响

# 定义
dict1 = {
    "k1": "v1",
    "k2": "v2",
    "k3": "v3",
    "k4": 1,
    "k4": None,
    "k5": [1, 2, 3],
    "k6": {
        "kk6": {
            "kkk6": "vvv6"
        }
    },
    1: "1",
    True: "True",
    False: "False",
    0: "0",
    (1, 2): "1,2",
    # [1, 2]: "[1,2]" # key要求不可变
    # {"k1":"v1"} : "dict" # key要求不可变
}

print(dict1)

# 查
# 通过key获取value
print(dict1[1])
print(dict1["k1"])
# print(dict1["k11"]) # k11 不存在 直接报错
print(dict1.get("k11", "key不存在就返回默认值"))

# 改
dict1["k1"] = "vv1"
print(dict1)

# 增
dict1["kk1"] = "vvv1"
print(dict1)

# 集合
# 特点:可变的，里面的元素不可以重复,会自动去重，元素的类型可以不唯一，无序
# 定义
set1 = {1, 1, 1, 2, 2, 3, 4, True, "abc", 1.1}
print(set1)
# print(set1[0])
set1.add(5)
print(set1)
set1.add(2)
print(set1)

# 集合的运算
# 交集 并集 差集
set2 = {1, 2, 3, 4, 5}
set3 = {3, 4, 5, 6, 7}
print(set2 & set3)
print(set2 | set3)
print(set2 - set3)
print(set3 - set2)
set2.discard(3)
print(set2)

# 遍历
# 通过for循环

list1 = [1, 2, 3, 4]
for i in list1:
    print(i)

# 对list1中的每个元素 *2
for i in map(lambda x: x * 2, list1):
    print(i)

tuple1 = (1, 2, 3, 4, 5)
for i in tuple1:
    print(i)

dict1 = {"k1": "v1", "k2": "v2", "k3": "v3"}
for key in dict1:
    print(key, dict1[key])

for key in dict1.keys():
    print(key)

for value in dict1.values():
    print(value)

for kv in dict1.items():
    print(kv[0], kv[1])

for k, v in dict1.items():
    print(k, v)

set1 = {1, 2, 3, 3, 3, 4, 4}
for s in set1:
    print(s)

# enumerate
list2 = ['a', 'b', 'c', 'd']
cnt = 0
for i in list2:
    print(cnt, i)
    cnt += 1

for index, value in enumerate(list2):
    print(index, value)

# zip
name_list = ['zhangSan', 'liSi', 'wangWu']
score_list = [100, 90, 110]
for name, score in zip(name_list, score_list):
    print(name, score)

# 列表推导式
# 通过表达式生成一个list
# 想要一个list包含了1~10总共10个元素
# 想要一个list包含了1~100总共100个元素
list10 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

list100 = []
for i in range(1, 101, 1):
    list100.append(i)
print(list100)

list100_2 = [i for i in range(1, 101, 1)]
print(list100_2)

# 想要一个list包含了1~100的奇数总共50个元素
list100_2 = [i for i in range(1, 101, 2)]
print(list100_2)

list100_2 = [i for i in range(1, 101, 1) if i % 2 == 1]
print(list100_2)

list100_2 = [i for i in range(1, 101, 1) if i % 2 == 0]
print(list100_2)

# print("\n".join(["\t".join(["{} * {} = {}".format(i, j, i * j) for j in range(1, i + 1)]) for i in range(1, 10)]))

list3 = ['a', 'b', 'c']
print("|".join(list3))  # a|b|c
print("#" * 50)
# 9 9 乘法表
for i in range(1, 10):
    list1 = []
    for j in range(1, i + 1):
        str_format = "{} * {} = {}"
        list1.append(str_format.format(i, j, i * j))
    print(list1)

print("\n".join(["\t".join(["{} * {} = {}".format(i, j, i * j) for j in range(1, i + 1)]) for i in range(1, 10)]))